/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.aplicacao;

import com.sistema.db.Banco;
import com.sistema.db.MsgErro;
import com.sistema.tools.Data;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author gr
 */
public class DialogAdminSessoes extends JDialog
{

    private JPanel pnlPrincipal;
    private JButton btnDesconectarUsuario;
    private JButton btnSessoes;
    private ImageIcon img_usuario;
    private ImageIcon img_abrirSessoes;
    private ImageIcon img_fecharSessoes;
    private JTable tblSessoes;
    private static DefaultTableModel modeloTabela = new DefaultTableModel();
    private JScrollPane scroller;
    private JLabel jlbTitulo;
    private static boolean controle = false;
    private static int sessoes = 0;

    public DialogAdminSessoes()
    {
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
        setTitle( "Controle de Ligações Suporte" );
        setSize( 800, 700 );
        setLayout( null );
        setLocationRelativeTo( null );
        iniciaComponentes();
        actions();
        setVisible( true );

    }

    public void iniciaComponentes()
    {

        pnlPrincipal = new JPanel();
        pnlPrincipal.setLayout( null );
        pnlPrincipal.add( jlbTitulo = new JLabel( "Sessões Abertas" ) ).setBounds( 300, 20, 400, 60 );
        Font font_titulo = new Font( "Arial", Font.BOLD, 18 );
        jlbTitulo.setFont( font_titulo );


        pnlPrincipal.add( btnDesconectarUsuario = new JButton( "Desconectar usuário" ) ).setBounds( 80, 100, 300, 40 );
        pnlPrincipal.add( btnSessoes = new JButton() ).setBounds( 420, 100, 300, 40 );


        img_usuario = new ImageIcon( ( getClass().getResource( "/img/fechar_usuario.png" ) ) );
        img_abrirSessoes = new ImageIcon( ( getClass().getResource( "/img/abrir_sessoes.png" ) ) );
        img_fecharSessoes = new ImageIcon( ( getClass().getResource( "/img/fechar_sessoes.png" ) ) );


        btnDesconectarUsuario.setIcon( img_usuario );

        VerificaSessoes();


        tblSessoes = new JTable( modeloTabela )
        {

            public boolean isCellEditable( int rowIndex, int vColIndex )
            {
                return false;
            }
        };

        tblSessoes.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );

        scroller = new JScrollPane( tblSessoes );
        pnlPrincipal.add( scroller ).setBounds( 80, 180, 640, 420 );


        tabelaSessoes();

        add( pnlPrincipal ).setBounds( 1, 1, 800, 600 );

    }

    public void tabelaSessoes()
    {

        if ( controle == false )
        {
            controle = true;


            modeloTabela.addColumn( "Usuario" );
            modeloTabela.addColumn( "Setor" );
            modeloTabela.addColumn( "Categoria" );
            modeloTabela.addColumn( "Host" );
            modeloTabela.addColumn( "IP" );
            modeloTabela.addColumn( "Acesso" );




            Banco conn = new Banco();
            ResultSet rs = conn.executarConsulta( "SELECT a.nome, "
                    + "a.setor, "
                    + "b.descricao, "
                    + "c.host, "
                    + "c.ip, "
                    + "c.acesso "
                    + "FROM usuarios a "
                    + "INNER JOIN categoria_usuario b "
                    + "ON (a.ref_categoria=b.id) "
                    + "INNER JOIN sessoes c "
                    + "ON (c.ref_usuario=a.id)" );

            conn.fecha();

            try
            {
                Data dt = new Data();

                while ( rs.next() )
                {

                    modeloTabela.addRow( new Object[]
                            {
                                rs.getString( "nome" ),
                                rs.getString( "setor" ),
                                rs.getString( "descricao" ),
                                rs.getString( "host" ),
                                rs.getString( "ip" ),
                                dt.inverteDatetime( rs.getString( "acesso" ) )
                            } );
                }

                personalizaTabela();

            } catch ( Exception e )
            {
            }
        } else
        {
            atualizaTela();
        }
    }

     public void personalizaTabela()
    {
                 DefaultTableCellRenderer centralizado = new DefaultTableCellRenderer();
                 centralizado.setHorizontalAlignment(SwingConstants.CENTER);

                 //Tamanho colunas
                 tblSessoes.getColumnModel().getColumn( 0 ).setPreferredWidth( 50 );
                 tblSessoes.getColumnModel().getColumn( 1 ).setPreferredWidth( 30 );
                 tblSessoes.getColumnModel().getColumn( 2 ).setPreferredWidth( 50 );
                 tblSessoes.getColumnModel().getColumn( 3 ).setPreferredWidth( 20 );
                 tblSessoes.getColumnModel().getColumn( 4 ).setPreferredWidth( 20 );
                 tblSessoes.getColumnModel().getColumn( 5 ).setPreferredWidth( 80 );

                // Instala o TableRowSorter.
                TableRowSorter <TableModel> sorter;
                sorter = new TableRowSorter<TableModel>(modeloTabela);
                tblSessoes.setRowSorter(sorter);

                // Centraliza valores tabela
                 for(int x=1; x < modeloTabela.getColumnCount(); x++)
                 {
                     tblSessoes.getColumnModel().getColumn(x).setCellRenderer(centralizado);
                 }
    }

    public void atualizaTela()
    {

        int numLinhas = modeloTabela.getRowCount();


        for ( int x = numLinhas; x > 0; x-- )
        {
            modeloTabela.removeRow( 0 );
        }


        Banco conn = new Banco();
        ResultSet rs = conn.executarConsulta( "SELECT a.nome, "
                + "a.setor, "
                + "b.descricao, "
                + "c.host, "
                + "c.ip, "
                + "c.acesso "
                + "FROM usuarios a "
                + "INNER JOIN categoria_usuario b "
                + "ON (a.ref_categoria=b.id) "
                + "INNER JOIN sessoes c "
                + "ON (c.ref_usuario=a.id)" );
        conn.fecha();

        try
        {
            Data dt = new Data();

            while ( rs.next() )
            {

                modeloTabela.addRow( new Object[]
                        {
                            rs.getString( "nome" ),
                            rs.getString( "setor" ),
                            rs.getString( "descricao" ),
                            rs.getString( "host" ),
                            rs.getString( "ip" ),
                            dt.inverteDatetime( rs.getString( "acesso" ) )
                        } );
            }

            personalizaTabela();

        } catch ( Exception e )
        {
        }


    }

    public void VerificaSessoes()
    {

        Banco conn = new Banco();
        ResultSet rs = conn.executarConsulta( "SELECT status FROM propriedades" );
        conn.fecha();



        try
        {
            while ( rs.next() )
            {
                sessoes = rs.getInt( "status" );
            }

        } catch ( Exception e )
        {
            e.printStackTrace();
        }

        if ( sessoes == 0 )
        {
            btnSessoes.setText( "Fechar Sessões" );
            btnSessoes.setIcon( img_fecharSessoes );
        } else
        {
            btnSessoes.setText( "Abrir Sessões" );
            btnSessoes.setIcon( img_abrirSessoes );
        }



    }

    public void actions()
    {
        btnDesconectarUsuario.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();

                int linha = tblSessoes.getSelectedRow();
                int id = 0;

                if ( linha != -1 )
                {

                    String[] s = new String[]
                    {
                        "Sim", "Não"
                    };

                    int msg = JOptionPane.showOptionDialog( null, "Você tem certeza que deseja desconectar esse usuário?", "Mensagem", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, s, "Ok" );
                    switch ( msg )
                    {
                        case ( JOptionPane.YES_OPTION ):

                            Object valor = modeloTabela.getValueAt( linha, 0 );
                            Banco conn1 = new Banco();
                            ResultSet rs = conn1.executarConsulta( "SELECT id FROM usuarios WHERE nome = '" + valor + "'" );
                            conn1.fecha();
                            try
                            {
                                while ( rs.next() )
                                {
                                    id = rs.getInt( "id" );
                                }

                            } catch ( Exception g )
                            {
                                g.printStackTrace();
                            }

                            try
                            {

                                Banco conn = new Banco();
                                conn.executarAtualizacao( "DELETE FROM sessoes WHERE ref_usuario=" + id + "" );
                                conn.fecha();
                                atualizaTela();

                                JOptionPane.showMessageDialog( null, "Sessão finalizada com sucesso!" );

                            } catch ( Exception f )
                            {
                                new MsgErro( "Erro de Banco de dados: \n ", f );
                                f.printStackTrace();
                            }
                            break;
                    }

                } else
                {
                    JOptionPane.showMessageDialog( null, "Selecione uma sessão aberta" );
                }




            }
        } );

        btnSessoes.addActionListener( new ActionListener()
        {

            public void actionPerformed( ActionEvent e )
            {
                FormPrincipal.verificaSessao();
                FormPrincipal.verificaTipoUsuario();
                
                String[] s = new String[]
                {
                    "Sim", "Não"
                };

               
                if ( sessoes == 0 )
                {
                     int msg = JOptionPane.showOptionDialog( null, "Você tem certeza que deseja finalizar todas as sessões?", "Mensagem", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, s, "Ok" );

                    switch ( msg )
                    {
                        case ( JOptionPane.YES_OPTION ):

                            Banco conn = new Banco();
                            conn.executarAtualizacao( "DELETE FROM sessoes WHERE ref_usuario <> " + FormPrincipal.getId_usuario() + "" );
                            conn.fecha();

                            Banco conn1 = new Banco();
                            conn1.executarAtualizacao( "UPDATE propriedades set status= " + FormPrincipal.getId_usuario() + " "
                                    + "WHERE tipo = 'sessoes.acesso'" );
                            conn1.fecha();


                            VerificaSessoes();
                            atualizaTela();
                            JOptionPane.showMessageDialog( null, "Sessões finalizadas e bloqueadas, apenas é permitido acesso do teu usuário." );

                            break;

                    }
                } else
                {
                    int msg2 = JOptionPane.showOptionDialog( null, "Você tem certeza que deseja liberar todas as sessões?", "Mensagem", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, s, "Ok" );

                    switch ( msg2 )
                    {
                        case ( JOptionPane.YES_OPTION ):
                        {
                            Banco conn1 = new Banco();
                            conn1.executarAtualizacao( "UPDATE propriedades set status= 0 WHERE tipo = 'sessoes.acesso'" );
                            conn1.fecha();

                            VerificaSessoes();
                            atualizaTela();
                            JOptionPane.showMessageDialog( null, "Sessões liberadas para acesso." );
                            break;
                        }
                    }



                }
            }
        } );
    }
}
